#include <stdio.h>
#include "HsTypes.h"
#include "crc32_sb.h"

/* poly=0xedb88320 */
hs_uint32_t wlan_crc32tab[] = {
        0x00000000,
        0x1db71064,
        0x3b6e20c8,
        0x26d930ac,
        0x76dc4190,
        0x6b6b51f4,
        0x4db26158,
        0x5005713c,
        0xedb88320,
        0xf00f9344,
        0xd6d6a3e8,
        0xcb61b38c,
        0x9b64c2b0,
        0x86d3d2d4,
        0xa00ae278,
        0xbdbdf21c,
};

hs_uint32_t wlan_crc(
                        hs_uint32_t *tab, 
                        hs_uint32_t crc, 
                        hs_uint8_t *data, 
                        hs_int32_t n
                    )
{
        int i;

        for(i = 0; i < n; i++)
        {
                crc ^= *data++;
                crc = tab[crc & 0xf] ^ (crc >> 4);
                crc = tab[crc & 0xf] ^ (crc >> 4);
        }

        return crc;
}

void copy_crctable(
                    hs_uint32_t *crctab
                   )
{
    int i;
    
    for(i = 0; i < WLAN_CRC_TAB; i++){
        crctab[i] = wlan_crc32tab[i];
    }    
}
                    
hs_uint32_t
wlan_tx_calc_crc(
                    int len,
                    hs_uint8_t *data,
                    hs_uint32_t *crctab
                )
{        
        hs_uint32_t crc;

        crc = wlan_crc(crctab, 0xffffffffU, data, len) ^ 0xffffffffU;

        return crc;
}
